package cn.jbit.generatedbdata.generateData;


import cn.jbit.generatedbdata.GenerateAllData;
import cn.jbit.generatedbdata.tools.DBUtil;
import cn.jbit.generatedbdata.tools.StringUtil;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *  向rt_ycak.machine_local_info 中生产 机器基本信息维度数据
 */
public class GenerateRtYcakMachineLocalInfoTblData extends  Thread{
    @Override
    public void run() {
        GenerateData();
    }

    private void GenerateData() {
        System.out.println("线程名: "+getName()+" 运行，开始向 rt_yack 库中的 machine_local_info 表生产数据");

        Connection conn = null;
        String sql = null;
        List<Object[]> params = null;
        try {
            //1.获取数据库 rt_ycak 连接
            conn = DBUtil.getRTYcakConnection();

            //2.先将表 song 数据清空
            DBUtil.deleteTblData(conn, "rt_ycak.machine_local_info");

            /**
             * 3.读取文件中的数据
             * 获取日志文件数据路径:
             * GenerateAllDBData.class.getClassLoader().getResource().getPath 获取的是编译后classes文件夹的根路径
             *
             * 注意：这里是循环读取此文件 ,生产数据时，每隔1s生产200条即可
             */
            InputStream in= GenerateAllData.class.getClassLoader().getResourceAsStream("rt_ycak_machine_local_info.txt");
            BufferedReader br=new BufferedReader(new InputStreamReader(in));
            String line=br.readLine();

            //4.准备SQL语句
            sql = "INSERT INTO rt_ycak.machine_local_info (" +
                    "mid,province_id,city_id,province,city,map_class,mglng,mglat,address,real_address,revenue_time,sale_time)" +
                    " VALUES (?,?,?,?,?,?,?,?,?,?,?,?)";

            //5.准备列表，每满1000条数据就批量向MySQL对应表中插入数据
            params = new ArrayList<>();
            int flag = 0;
            while(line!=null){
                System.out.println("生成机器位置信息数据》》》》》："+line);
                //解析每一行line
                String[] split = line.split("\\^");
                params.add(new Object[]{
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[0])),//mid
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[1])),//province_id
                        StringUtil.convertStringtoInt(StringUtil.strTrimStartAndEnd(split[2])),//city_id
                        StringUtil.strTrimStartAndEnd(split[3]),//province
                        StringUtil.strTrimStartAndEnd(split[4]),//city
                        StringUtil.strTrimStartAndEnd(split[5]),//map_class
                        StringUtil.strTrimStartAndEnd(split[6]),//mglng
                        StringUtil.strTrimStartAndEnd(split[7]),//mglat
                        StringUtil.strTrimStartAndEnd(split[8]),//address
                        StringUtil.strTrimStartAndEnd(split[9]),//real_address
                        StringUtil.strTrimStartAndEnd(split[10]),//revenue_time
                        StringUtil.strTrimStartAndEnd(split[11])//sale_time
                });
                flag++;
                if(flag == 200){
                    //3.向表中生产数据
                    DBUtil.executeBatch(conn, sql, params);
                    //清空计数与集合
                    flag = 0;
                    params.clear();
//                        Thread.sleep(1000);//每1s生产200条数据
                }

                line=br.readLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {//将最后剩余不够200条的数据插入到数据库表中
                DBUtil.executeBatch(conn, sql, params);
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            System.out.println("线程名: "+getName()+" 运行，向 rt_ycak 库中的 machine_local_info 表生产数据完成");
        }
    }
}

